Computing has become a ubiquitous part of every day life. Computing systems, such as personal computers, have become a fixture in both the home and office. As the capabilities of computing hardware has increased, and as the complexity of tasks performed on computers has increased, the demands upon the operating systems that manage operations in a computing environment have likewise increased.
A modern personal computer may typically be capable of operating multiple processes simultaneously, with each process performing jobs using one or more threads. The threads of a process perform the individual tasks of computing, which may be broken into specific jobs to be processed.
Each job to be processed may be placed in one of a plurality of queues to await processing, the jobs in a queue potentially, but not necessarily, being interrelated. Queues may be prioritized, so that jobs having a high priority will be processed before jobs having a lower priority. A queue of jobs to be performed may exist within a programming construct often referred to by those skilled in the art as a context. A context may contain a variety of objects, and may further contain a queue of jobs to be processed, and other information relevant to performing operations within that context. One context that may be familiar to many computer users is the user interface context. The user interface context is the context within which output is provided to a user, for example through a computer screen, and through which input is received, for example via a keyboard or mouse. Any number of other contexts may exist within a computing system beyond a user interface context.
To maintain the integrity of computer processing and computer data, care must be taken in the design of a computing system. This is particularly true in the design of an operating system that coordinates the allocation of computing resources. For example, an operating system may require that only one thread may manipulate an object or data at a given time. If multiple threads seek to access or manipulate the same object or the same data simultaneously, the result to the data and to the operations of a computing system are unpredictable, and can include data corruption.
Beyond assuring that only one thread may access a given object or data at a single time, a computer operating system should also seek to optimize the performance of a computing system. One way to optimize the performance of a computing system is to assign a priority to jobs when they are received into a queue within a context. The jobs may thereafter be performed by threads in priority order. In this scenario, a job remains in the queue at its assigned priority until the job is performed by a thread. While such a static queue model has served well in past computing systems and operating systems, a dynamic queue model may be beneficial given the increasing complexity of computing systems.
Even as new approaches to computing systems and operating systems are being developed to take advantage of new computing capabilities, it is useful to maintain what is referred to in the art as backward compatibility as much as possible. Backward compatibility refers to the ability of a computer system to operate prior generations of software applications in a newer operating system. While a number of approaches may be used to obtain backward compatibility, many of these approaches can increase the resources required to run the operating system and add to the complexity of the system, with corresponding increased opportunity for system failures and system crashes. Accordingly, it is often desirable to provide for backward compatibility in an elegant fashion that maintains the stability of the new operating system while still permitting older software applications to operate.